package org.example.operator.action

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 *  案例实操
 *
 *  统计出每一个**省份**每个广告被点击数量排行的Top3
 */
object Spark02_RDD_Operator_Aggregate {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
    val context = new SparkContext(conf)

    val rdd: RDD[Int] = context.makeRDD(List(1,2,3,4),2)

    // 之前我们学过aggregateBykey的转换算子
    /**
      * 可以自定义分区间计算规则和分区内的计算规则
      */
    val i: Int = rdd.aggregate(0)(_+_,_+_)

    /**
      * 如果设置初始值会如何呢
      *
      * aggregateByKey:初始值只会参与分区间的计算
      * aggregate:初始值会参与分区间计算，并且参与分区间计算
      *
      * 也就是说，在相同两个分区中
      *
      * 1 2 +10 = 12
      *
      * 3 + 4 +10 = 17
      *
      * 以上是分区内计算
      *
      * 在分区间计算时
      *
      * 10+12+17 = 40
      *
      * 初始值会再次参与计算
      */
    val i1: Int = rdd.aggregate(10)(_+_,_+_)
    // 同样，这也有简写形式
    rdd.fold(10)(_+_)
    context.stop()
  }
}
